package com.qf.service;

import com.qf.constant.CacheConstants;
import com.qf.feign.CacheFeign;
import com.qf.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
@Slf4j
public class FilterChainManagerImpl implements FilterChainManager {

    @Autowired
    private CacheFeign cacheFeign;

    @Autowired
    private Map<String,FilerChainService> filerChainMap;

    @Override
    public void execute(StandardSubmit standardSubmit) {

        //1. 获取短信客户端id
        Integer clientID = standardSubmit.getClientID();

        //2.调用feign远程调用cache缓存模块 根据客户端ID获取客户对象数据
        Map clientMap = cacheFeign.hMGet(CacheConstants.CACHE_PREFIX_CLIENT + clientID);
        if (clientMap == null){
            log.info("[策略管理者 - 客户端ID错误] clientID={}" + clientID);
            return;
        }

        //3. 获取缓存数据中客户设置的过滤名称和执行顺序字符串
        Object strategyObj = clientMap.get("filters");
        if (strategyObj == null){
            log.info("[策略管理者 - 客户没有策略执行设置]客户端ID为 clientID={}" + clientID);
            return;
        }

        // 从redis中获取客户提前设置的策略 和 执行顺序
        String[] strategyArray = String.valueOf(strategyObj).split(",");

        //4. 遍历客户设置的策略数组  保证顺序执行
        if (strategyArray != null){
            for (String strategyName : strategyArray) {
                //5. 根据客户设置的需要执行的策略名称和顺序  匹配具体的策略实现类执行
                FilerChainService filerChainService = filerChainMap.get(strategyName);
                //执行策略
                boolean flag = filerChainService.strategy(standardSubmit);
                //如果执行失败  不继续向后执行其他策略
                if (!flag){
                    log.info("[策略管理者 - 策略执行失败] 客户端ID为 clientID={}， 策略名称={}" + clientID,strategyName);
                    return;
                }
                log.info("[策略管理者 - 策略执行成功] 客户端ID为 clientID={}， 策略名称={}" + clientID,strategyName);
            }
        }
    }
}
